Java 8์์ ์์ ๋ฒ์ ์ผ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋ (Workflow)
Java 8์์ 11, 17, ํน์ 21๋ก ๋ฒ์ ์ ์ฌ๋ฆฌ๋ ๊ฒ์ ๋จ์ํ ์ซ์ ๋ณ๊ฒฝ ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ํนํ Java 9์์ ๋์ ๋ ๋ชจ๋ ์์คํ (Project Jigsaw)๊ณผ ์ญ์ ๋ API๋ค๋ก ์ธํด ์ฒด๊ณ์ ์ธ ์ ๊ทผ์ด ํ์ํฉ๋๋ค. ์ฑ๊ณต์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํ 6๋จ๊ณ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
1๋จ๊ณ: ์ฌ์ ์ํฅ๋ ๋ถ์ (jdeps ํ์ฉ)
๊ฐ์ฅ ๋จผ์ ํ ์ผ์ ์ฐ๋ฆฌ ์ฝ๋๊ฐ JDK ๋ด๋ถ API(Internal API)๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
jdeps๋๊ตฌ ์ฌ์ฉ: JDK์ ๋ด์ฅ๋ ์ด ๋๊ตฌ๋ ์์กด์ฑ์ ๋ถ์ํด ์ค๋๋ค.jdeps --jdk-internals -recursive -cp "lib/*" your-app.jar- ์กฐ์น:
sun.*๋๋com.sun.*๊ณ์ด์ ๋ด๋ถ API ํธ์ถ์ด ๋ฐ๊ฒฌ๋๋ฉด,java.*๋๋javax.*์ ๊ฐ์ ํ์ค API๋ก ๋์ฒดํด์ผ ํฉ๋๋ค. (์:sun.misc.BASE64Encoderโjava.util.Base64)
2๋จ๊ณ: ๋น๋ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฐ์ดํธ
์ต์ Java๋ฅผ ์ง์ํ์ง ์๋ ๋น๋ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฐ์ฅ ํฐ ๊ฑธ๋ฆผ๋์ ๋๋ค.
- ๋น๋ ๋๊ตฌ ์ต์ ํ:
- Maven: 3.8.x ์ด์ ๊ถ์ฅ
- Gradle: 7.3 ์ด์ (Java 17/21 ์๋ฒฝ ์ง์์ ์ํด 8.x ๊ถ์ฅ)
- ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ: ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๊ฑฐ๋ ๋ฆฌํ๋ ์
์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ๋์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
- Lombok (1.18.20+), Mockito (3.x+), Byte Buddy, Hibernate, Spring Boot (3.x๋ Java 17+ ํ์)
3๋จ๊ณ: ์ญ์ ๋ ๋ชจ๋ ๋์ (J2EE ๋ชจ๋)
Java 11๋ถํฐ JDK์ ํฌํจ๋์ด ์๋ Java EE(ํ์ฌ Jakarta EE) ๊ด๋ จ ๋ชจ๋์ด ์ญ์ ๋์์ต๋๋ค.
- ๋ฌธ์ : JAXB, JAX-WS, JTA ๋ฑ์ด ํฌํจ๋ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํด๊ฒฐ:
pom.xml๋๋build.gradle์ ๋ช ์์ ์ผ๋ก ์์กด์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.<!-- ์: JAXB ์ถ๊ฐ --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.1</version> </dependency>
4๋จ๊ณ: ์ปดํ์ผ๋ฌ ์ค์ ๋ณ๊ฒฝ (Release ์ต์ )
๋จ์ํ source์ target ๋ฒ์ ์ ๋ฐ๊พธ๋ ๊ฒ๋ณด๋ค --release ์ต์
์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํฉ๋๋ค.
- Maven ์ค์ ์์:
<properties> <maven.compiler.release>17</maven.compiler.release> </properties> - ์ด์ :
release์ต์ ์ ํด๋น ๋ฒ์ ์ ๋ฌธ๋ฒ๋ฟ๋ง ์๋๋ผ, ํด๋น ๋ฒ์ ์ ์กด์ฌํ๋ API์ธ์ง๊น์ง ์ฒดํฌํด ์ค๋๋ค.
5๋จ๊ณ: ๋ฐํ์ ๋ฐ ๋ฆฌํ๋ ์ ์ค๋ฅ ํด๊ฒฐ
Java 17์ JDK ๋ด๋ถ ํจํค์ง๋ฅผ ๊ฐ๋ ฅํ๊ฒ ์บก์ํํฉ๋๋ค. ๋ง์ฝ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฆฌํ๋ ์
์ผ๋ก JDK ๋ด๋ถ๋ฅผ ๊ฑด๋๋ฆฐ๋ค๋ฉด InaccessibleObjectException์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์์ ์กฐ์น: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ JVM ์ต์
์ผ๋ก ๊ฐ์ ๊ฐ๋ฐฉํ ์ ์์ต๋๋ค.
--add-opens java.base/java.lang=ALL-UNNAMED - GC ๋ก๊ทธ ๋ณ๊ฒฝ: ๊ธฐ์กด์
-XX:+PrintGCDetails๊ฐ์ ์ต์ ์-Xlog:gc์ ๊ฐ์ ํตํฉ ๋ก๊น ์์คํ ์ต์ ์ผ๋ก ๋์ฒดํด์ผ ํฉ๋๋ค.
6๋จ๊ณ: ์๋ํ ๋๊ตฌ ํ์ฉ (OpenRewrite)
์๋ฐฑ ๊ฐ์ ํ์ผ์ ์ผ์ผ์ด ์์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์๋ํ ๋๊ตฌ๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
- OpenRewrite: Java ๋ง์ด๊ทธ๋ ์ด์ ๋ ์ํผ๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ฆฌํฉํ ๋งํด ์ค๋๋ค.
- ์คํ ์์ (Maven):
mvn org.openrewrite.maven:rewrite-maven-plugin:run \ -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava17
๋ง๋ฌด๋ฆฌ: ์ ์ง์ ๋์ ์ ๋ต
- ์ปดํ์ผ์ Java 8 ํ๊ฒ์ผ๋ก, ์คํ์ ์ต์ JDK๋ก: ๋จผ์ ํ๊ฒฝ๋ง ๋ฐ๊พธ๊ณ ํ ์คํธ๋ฅผ ํต๊ณผ์ํต๋๋ค.
- ์ปดํ์ผ ํ๊ฒ ์ํฅ: ๋น๋ ์ค์ ์ ์ํฅํ๊ณ ์ปดํ์ผ ์๋ฌ๋ฅผ ์ก์ต๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ ๋์
: ์ฑ๊ณต์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
์ด ๋๋ ํ,
Record,Text Blocks,Switch Expressions๊ฐ์ ์๋ก์ด ๋ฌธ๋ฒ์ ์ ์ง์ ์ผ๋ก ์ ์ฉํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ๊ณ ํต์ค๋ฌ์ด ๊ณผ์ ์ผ ์ ์์ง๋ง, Java 17/21์ด ์ฃผ๋ ์๋์ ์ธ ์ฑ๋ฅ ํฅ์๊ณผ ์์ฐ์ฑ ๋๊ตฌ๋ค์ ๊ทธ ๊ฐ์น๊ฐ ์ถฉ๋ถํฉ๋๋ค.